﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace Noris.Schedule.Support.Forms
{
	/// <summary>
	/// Knihovna obrázků jádra, 48 x 48 pixel
	/// </summary>
	public static class PicLibrary48
	{
		#region Image Error
		/// <summary>
		/// Vrátí obrázek, vytvořený na základě obrázku error.png.
		/// Vrací přímou referenci na objekt v paměti = volání je velice rychlé (pod 1 mikrosekundu), 
		/// ale protože se vrací živá reference, pak zásahy do vráceného objektu se projeví v objektu v paměti = natrvalo.
		/// Případně je možno vyvolat metodu Error_Reset(), která zajistí regenerování obrázku z jeho definice.
		/// Bezpečnější je používání property Error, která vrací vždy nový objekt.
		/// Pro používání pro Button.Image, kde bude nastavováno Button.Enabled = false; je třeba použít property Error_FromFile.
		/// </summary>
		/// <remarks>
		/// Plné jméno vstupního souboru:
		/// C:\David\CsProj\GreenSchedule\Support\pic\48\error.png
		/// </remarks>
		public static System.Drawing.Image Error_Cached
		{
			get
			{
				if (_Error == null) _Error = Error;
				return _Error;
			}
		}
		/// <summary>
		/// Vrátí obrázek, vytvořený na základě obrázku error.png.
		/// Nelze používat jako Image pro Buttony, kde bude nastavováno Enabled = false (pak dojde k chybě .NET: Ot of memory).
		/// Pak je třeba použít Image Error_FromFile.
		/// Vrací vždy novou instanci = volání je při častém používání výrazně (až 1000krát) pomalejší než použití Error_Cached
		/// (kde ale hrozí nebezpečí pokažení obrázku v paměti).
		/// Čas pro vytvoření jednoho Image (tj. každé jednotlivé čtení této property) pro obrázek velikosti 32x32 px (32bpp) je průměrně 350 mikrosekund.
		/// Pokud je třeba používat obrázek často a rychle, je možné využít property Error_Cached.
		/// </summary>
		/// <remarks>
		/// Plné jméno vstupního souboru:
		/// C:\David\CsProj\GreenSchedule\Support\pic\48\error.png
		/// </remarks>
		public static System.Drawing.Image Error { get { return _ImageCreateFrom(_Error_string, null); } }
		/// <summary>
		/// Vrátí obrázek, načtený ze souboru error.png.
		/// Vrací vždy novou instanci = volání je při častém používání výrazně (až 1000krát) pomalejší než použití Error_Cached
		/// (kde ale hrozí nebezpečí pokažení obrázku v paměti).
		/// Čas pro vytvoření jednoho Image (tj. každé jednotlivé čtení této property) pro obrázek velikosti 32x32 px (32bpp) je průměrně 350 mikrosekund.
		/// Pokud je třeba používat obrázek často a rychle, je možné využít property Error_Cached.
		/// </summary>
		/// <remarks>
		/// Plné jméno vstupního souboru:
		/// C:\David\CsProj\GreenSchedule\Support\pic\48\error.png
		/// </remarks>
		public static System.Drawing.Image Error_FromFile { get { return _ImageCreateFrom(_Error_string, "error.png"); } }
		/// <summary>
		/// Vygeneruje a vrátí string, který definuje obsah souboru Error
		/// </summary>
		/// <returns></returns>
		private static string _Error_string()
		{
			System.Text.StringBuilder sb = new System.Text.StringBuilder(4276);
			sb.Append("iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAK3RFWHRDcmVhdGlvbiBUaW1lAEZyIDE2IE1haSAyMDAzIDE0OjU1OjE4ICswMTAwuGncSAAAAAd0SU1F");
			sb.Append("B9MFEAw3LoVMSFEAAAAJcEhZcwAACvAAAArwAUKsNJgAAAAEZ0FNQQAAsY8L/GEFAAAL30lEQVR42u1Ze3BVxRn/nXNvbnKTSxIiKkKlomNnGG3taP2jjrVVqSPMCK10");
			sb.Append("6kyntVo7ah0tEA22UttSta0CovQxTq19WK2ibaEdFMeIAUFEWxRREYQEQoC8yTu5ufecs/2+fdyz9+1M+yc72Zxz9uzu+f2+1367FzhZTpb/qTi5DeJ8JFICy8QkFsDH");
			sb.Append("VEFtAf3jq6B/Pt876p6vgW/di/Det+6z5gjonRkvFALuyyXQ3zDfClzVGDg4Qf3WT+vBqrOB8aIEGHzgoSW4aNbn3JuWwj19tkLo0SwiTVe69xmBB6R9eRWeB8en+zS9");
			sb.Append("5ys9y3787FFN62e+53cpT92nfDk2oDG+vgbpgKbwqRu9o3E+fTtF/cf6BzHedhDpZHrHlG7MnQNMGMxRmwBL3iXw0VXrgKT+sKNFy6AZoK+ASxC+Bi9Bm5rOeU4pAaQn");
			sb.Append("FfjKtLyKmOmriEiBVKgxDrfxPZGIRqkdccRrG+DtevOSgdO8JejBLwoSEBNYELmpEZj0lD5He4C3nweG++k5UNL39JWBs2ImfTjCVwA8oUCzTXA/TxOX7VqTstIYmsOn");
			sb.Append("9iAQempBw4TuLtQzvyMbTAUx+NV1iJ05G8n9BxYSsiIEAkx1Zpyr1M+zbrhLG6yrQfPHod6Rpe7d0o3ugz4uX9SgDNcTIUF5LfLM/egTI0MEIAK4lUpePC1Xaf/6nts9");
			sb.Append("svpJvw8i6rI/nGFjdu0H/o78x5539D2lcqdCEZA1okyqwsW+rV3ojM5BXdOPsPPvJ9SXXFe7laurfR8+M9ehXnr68WrgmmvhJkOPNE4vuxpnd3WQIPKByA462Rrgl6xD");
			sb.Append("l+1vQoUBlhqTkmGErsThQEsnOsZn4pwtzXBrEhghcb695kFceHW9/moQhhOYcGO+4WP4OPW652dwb2ik3o2IjF6Bqq0tGIlkY5FBSocZQ0rkEMjWgPy2sJzVD8GzhOkD");
			sb.Append("H7Ucx+GRGZi9+Q1ytjTEQD/qlyxHfHEj9r4yqKIW7FiIDBFBcw0fIxxNy+Hedi9JfhJuKg3/d6+i4stzkdCmIywSJrQa+QUoQQBGAwa8NCkDPsDBrZ1oHz4DZ728Ha7u");
			sb.Append("49Dsgoy5ruk+xO64E63bhnVgt0gweFL/yNEAzp3LEVl8P4FP0lh6JsIcddK/bkblvPmojalPGxKONY3Qyi3tA54fkkhrTyLwba914lDPKfjkS9vgBnotoFkd0jGTYI+s");
			sb.Append("WfYAIt9vQsdbo+FKZsAfofkaFXiHwEuvIJ+RlVC5rPiHX0B87jw0TAlJ2IubMYaiBOTLgCOQXgMYKM3ctq0Lrd3TMKt5B1y2SZYaA7eq4L7Dg6huIhJ33IWePeN6/SDw");
			sb.Append("7TTfkh9mgTfjMiQIIreLNS+i+qqFmDbVVTJCuMJDlDEhClFw0jqma1s+vLMXB4/X48xmMhtGryUPC0SmcvvwECqXPQTn1sUY3J/ESBsJ5HuNcJf+nMBPyj42+MzYMPAA");
			sb.Append("D25A4uqFOO30KvgpHWIRpjDFo1CgfSCSlgQO/2cQH/WehlmvEniWcjoFhz9qfdiULBJkTpHlj5AWkxQCCejdq+FMTKggqsfaVzM+qzzwD9TGrwde2YT+D/pCDZQi4Mt/");
			sb.Append("fiZ/mTqtAtH9nfDa2xA751O0epYAblVpYqQJ555fEWgaM5FUkrclXgq8KaMDSPNaZDtxKR9QnuIrH6Bkq+7UGC7+QgJDC+fCP9wKp7IqE5jzQFvFaMJJktRTE3k+Y6Rf");
			sb.Append("EvziK9G7eTO6jwxK0zZ+4JfyAY/nSusMkokQiSkNVbjg0hqMXXs5AtKEWxWXkswthTThlCBbiHimLJmLvh1voK9zQi3uVipeUgMZHzBZJf0xiQSRmHNRHKlFX0RwrJ0y");
			sb.Append("yqo8cyhWShErDP5K9O/YIcHzwskSN9IPRJkwKlmadcCEUY7nFJVq6itx9vkxBIs+DxzvAGKhOZUCWghsURJN8zG48y30E3gnam1uDAknXOAKEpDsjAml9UImc3mqqQDV");
			sb.Append("tVU4c3YU7qKL4XTlk/i4WihY7pqPoe2vof/4qJS8sGJ/1i6t1ErMJuTkaSAIEzoiVVVbiemfiCB23UVwe7soM60sS6BsYfCvM/gxmfAaiWcyGVODcPtZkIB04sw2kAEL");
			sb.Append("axOiR5MmYjUVaKDEs2bh+XAHeuBEIgWds5i0M+0s0tsvwxBlov3HFPjAApylAWvfXZSA2pSYrV46pGy0YHYZZFIebwEWXAdx6oz8WT8OePUAfOYyVNbVqNXWAm6cVjox");
			sb.Append("Qq3kluxkzviA2ZhnpC9CXyCtJDtSmJi/CGMr/kxbpSTyXat4Eblx8Ob7UfXtRsz89Ay5fRZW9m4TMqcauSYUzZ5da8DxNQEo/mZjQk3JzjTGKE9h8BFaKXl2wWmGznH4");
			sb.Append("atdCmshr/9Y9iNNGZ5b7BNr+3a5MCWHMNyQcg7EYAZ+3bnwq4KTCzbkVBpI9HkbnfQWjK56EOzLIiTLlOm7puP5xy/X3oiZagdkVv8eB7a0IIqEmTFrNN14pAtLGUmnV");
			sb.Append("7GsNOMruk/0C41+6CsM/+ZMEL2crsCKXM59iWpHlGz9Agnb551b8ER80fyhh2GlEoZJHQIZRRx9AqewOk2QpY5dfhYH7ni0LPteECplTSY19vQmJigrMcZ7AnpfeV2cK");
			sb.Append("xoScMj4gWTJwkZIrskPKmByhpPDSK9C34q+IjA2qTgS+HEiNVC9A2X0C0mjJRe2rS1BLqft54i/Ys+l9tRPTJoRSYVRu6il8BnzURwSS5AoTc85D58r1cMaHpVkZEGWl");
			sb.Append("z+ArqlTYJdsuRri4JpZh6qJv4oIFF4bnryiTjUIeuPlS+nxW6ZAjTdn3ARo2/gE+pQ2iFGAbDGuouhbxJ1cgcfc8TSJWsH9REnwauPdNHNrVmnFkUW4dkPGWwVP1+eiP");
			sb.Append("nifJBmf8cinqt20gUFOyTKIgEQp2Ij4FNU89ADz/GAZ37Ub1T79G8d2jiBXJmJC5FiyjtEquuhG7nm6m9II2Rq51zFSKAJtQkObTYU+e4ZiTxBHqdcaDt6F2+z8JXAI8");
			sb.Append("YyFJMvighsA/txLuurU4+lEf+ihF6N/+OqofukFpRpOw/UHdaxAjBH7ljXj7uS3o7xqVCDOLWpD/e0C+BvjInKpH6M2xJgfWQfKH6StvwZS3NiGojOeTIHABaaj2udWI");
			sb.Append("PvMIOj7skQd7gjTY2zYgd1dxkqr0DSIRAucDXCHzHIwNScnvXtdCxEdkSp37m0FJDQTycNmXZ5A+2Q87jDnTTdG7fopI01fdgsQ7m7NJsOSralD3r98gtu5RtO/tltr0");
			sb.Append("zWEtkeja14uel19B/NGbs0jI02kOyRyeV9+Ad0nyGfBCHY7YP5yU9QGf7Z/yIf7RwTcn5BaJrp4Upj98KxK7WxCwYxOJgMyqbuNjqHx6NQ693y0XH19YlUkQoI49neh6");
			sb.Append("8WXEf3u78hU2J4pQztAJuGtuxLsk+Z6jw7KvyYN8a1MjgjIEZBiVv5hoJ87ZDniaxLEjIzh97e2o2bsDfv00TN30OKqfeRiH3uuS6YgZl0lmdXViQPs7R3F84ybEH19K");
			sb.Append("molC0NoSXfMdvPtsC3rbh9Tqa+X/WQldAQ3kJXM+78T4nEz7AKxtnLFFbj9yoA+zHluKxP7rUPXSU2jd06WW/SD7NC03owSRaH2TEjZsxMwYPZzoxp6/bUV3x5BcdXM3");
			sb.Append("L7m/r5UkwNBTyUlqdJQGFP7MQHO4ytckefah3UcwM70OB3cfk9qDlpLZ+hmpmWTMgIsQ7gM7D5FGXsBA1wC62wfhRkOgRvLmPNQLiofR7FTCwYnxrq5ZmH4W5XBREJfM");
			sb.Append("Fs8+bM4ce08G6H3jcObcPusoHPm5fJZW6HlXyz41pyOzl6x+pqasVVhb0LGiBMgf1/ftb/vstJpapKrrMKaPSK1TcqkVE84yP6Xa4GwSOf2CAvNktho5odIOnQa83pGt");
			sb.Append("z8JsP7QA1X49mmMRXFI3/RSkx0bhT0yGUjKqtEwJxlaL3EOHU5Fzn2XbOQREoE3P6quFsIWar/4uJQgFCXB5EYg7CSyhAdfQmAYD2AvyScD8aO2H4IICfYSVBpfbfBbK");
			sb.Append("T3kJossGMpe1NviT5WT5P5T/ApOsE/qnoUNzAAAAAElFTkSuQmCC");
			return sb.ToString();
		}
		/// <summary>
		/// Resetuje obrázek v paměti.
		/// Následující použití property Error_Direct si vytvoří nový, korektní - podle jeho originální deklarace.
		/// Tuto metodu je vhodné použít v situaci, kdy je správnost obrázku v paměti nejistá.
		/// </summary>
		public static void Error_Reset()
		{
			_Error = null;
		}
		/// <summary>
		/// Úložiště objektu v paměti, při prvním použití Error_Direct je objekt naplněn a následně využíván.
		/// </summary>
		private static System.Drawing.Image _Error = null;
		#endregion
		#region SPOLEČNÉ METODY PRO KONVERZI
		/// <summary>
		/// Vrátí Image z definice (string). Image generuje buď v paměti, anebo s pomocí souboru.
		/// Pokud není zadán parametr (cacheFileName) (když je null), generuje se Image v paměti.
		/// Pokud je soubor (cacheFileName) definován, pak se Image čte z něj.
		/// Pokud soubor neexistuje, nejprve se vytvoří.
		/// Umístění souboru (adresář) je dán property _ImageCacheDir, defaultně je to adresář (Sys:\Documents and Settings\All Users\Data aplikací\IconCache).
		/// Obsah obrázku definuje metoda getDataMethod.
		/// </summary>
		/// <param name="getDataMethod"></param>
		/// <param name="cacheFileName"></param>
		/// <returns></returns>
		private static System.Drawing.Image _ImageCreateFrom(_GetStringDelegate getDataMethod, string cacheFileName)
		{
			System.Drawing.Image image;
			if (cacheFileName == null)
			{
				using (System.IO.MemoryStream ms = new System.IO.MemoryStream(Convert.FromBase64String(getDataMethod())))
				{
					image = System.Drawing.Image.FromStream(ms);
				}
				return image;
			}
			string fileName = System.IO.Path.Combine(_ImageCacheDir, cacheFileName);
			if (!System.IO.File.Exists(fileName))
				System.IO.File.WriteAllBytes(fileName, Convert.FromBase64String(getDataMethod()));
			if (System.IO.File.Exists(fileName))
				return Image.FromFile(fileName);
			return null;
		}
		/// <summary>
		/// Obsahuje jméno adresáře, který slouží jako Cache pro obrázky systému.
		/// </summary>
		private static string _ImageCacheDir
		{
			get
			{
				string dirName = System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.CommonApplicationData), "IconCacheSupport48");
				if (!System.IO.Directory.Exists(dirName))
					System.IO.Directory.CreateDirectory(dirName);
				return dirName;
			}
		}
		/// <summary>
		/// Předpis pro metody, které generují obsah souboru s daty
		/// </summary>
		/// <returns></returns>
		private delegate string _GetStringDelegate();
		/// <summary>
		/// Vrátí Icon z dat (string), která jsou předána na vstup v kódování Base64
		/// </summary>
		/// <param name="data">Vstupní data v kódování Base64</param>
		/// <returns>Icon vytvořená z dat</returns>
		public static System.Drawing.Icon ConvertStringToIcon(string data)
		{
			System.Drawing.Icon icon;
			using (System.IO.MemoryStream ms = new System.IO.MemoryStream(Convert.FromBase64String(data)))
			{
				icon = new System.Drawing.Icon(ms);
			}
			return icon;
		}
		/// <summary>
		/// Vrátí Cursor z dat (string), která jsou předána na vstup v kódování Base64
		/// </summary>
		/// <param name="data">Vstupní data v kódování Base64</param>
		/// <returns>Cursor vytvořený z dat</returns>
		public static System.Windows.Forms.Cursor ConvertStringToCursor(string data)
		{
			System.Windows.Forms.Cursor cursor;
			using (System.IO.MemoryStream ms = new System.IO.MemoryStream(Convert.FromBase64String(data)))
			{
				cursor = new System.Windows.Forms.Cursor(ms);
			}
			return cursor;
		}
		#endregion
	}
}
